home *** CD-ROM | disk | FTP | other *** search
/ Chip 2005 August (Alt) / CHIP 2005-08.1.iso / program / guvenlik / syslinux-3.07.exe / com32 / lib / zlib / adler32.c next >
Encoding:
C/C++ Source or Header  |  2005-01-08  |  2.2 KB  |  75 lines

  1. /* adler32.c -- compute the Adler-32 checksum of a data stream
  2.  * Copyright (C) 1995-2003 Mark Adler
  3.  * For conditions of distribution and use, see copyright notice in zlib.h
  4.  */
  5.  
  6. /* @(#) $Id: adler32.c,v 1.1 2005/01/08 05:38:12 hpa Exp $ */
  7.  
  8. #define ZLIB_INTERNAL
  9. #include "zlib.h"
  10.  
  11. #define BASE 65521UL    /* largest prime smaller than 65536 */
  12. #define NMAX 5552
  13. /* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */
  14.  
  15. #define DO1(buf,i)  {s1 += buf[i]; s2 += s1;}
  16. #define DO2(buf,i)  DO1(buf,i); DO1(buf,i+1);
  17. #define DO4(buf,i)  DO2(buf,i); DO2(buf,i+2);
  18. #define DO8(buf,i)  DO4(buf,i); DO4(buf,i+4);
  19. #define DO16(buf)   DO8(buf,0); DO8(buf,8);
  20.  
  21. #ifdef NO_DIVIDE
  22. #  define MOD(a) \
  23.     do { \
  24.         if (a >= (BASE << 16)) a -= (BASE << 16); \
  25.         if (a >= (BASE << 15)) a -= (BASE << 15); \
  26.         if (a >= (BASE << 14)) a -= (BASE << 14); \
  27.         if (a >= (BASE << 13)) a -= (BASE << 13); \
  28.         if (a >= (BASE << 12)) a -= (BASE << 12); \
  29.         if (a >= (BASE << 11)) a -= (BASE << 11); \
  30.         if (a >= (BASE << 10)) a -= (BASE << 10); \
  31.         if (a >= (BASE << 9)) a -= (BASE << 9); \
  32.         if (a >= (BASE << 8)) a -= (BASE << 8); \
  33.         if (a >= (BASE << 7)) a -= (BASE << 7); \
  34.         if (a >= (BASE << 6)) a -= (BASE << 6); \
  35.         if (a >= (BASE << 5)) a -= (BASE << 5); \
  36.         if (a >= (BASE << 4)) a -= (BASE << 4); \
  37.         if (a >= (BASE << 3)) a -= (BASE << 3); \
  38.         if (a >= (BASE << 2)) a -= (BASE << 2); \
  39.         if (a >= (BASE << 1)) a -= (BASE << 1); \
  40.         if (a >= BASE) a -= BASE; \
  41.     } while (0)
  42. #else
  43. #  define MOD(a) a %= BASE
  44. #endif
  45.  
  46. /* ========================================================================= */
  47. uLong ZEXPORT adler32(adler, buf, len)
  48.     uLong adler;
  49.     const Bytef *buf;
  50.     uInt len;
  51. {
  52.     unsigned long s1 = adler & 0xffff;
  53.     unsigned long s2 = (adler >> 16) & 0xffff;
  54.     int k;
  55.  
  56.     if (buf == Z_NULL) return 1L;
  57.  
  58.     while (len > 0) {
  59.         k = len < NMAX ? (int)len : NMAX;
  60.         len -= k;
  61.         while (k >= 16) {
  62.             DO16(buf);
  63.             buf += 16;
  64.             k -= 16;
  65.         }
  66.         if (k != 0) do {
  67.             s1 += *buf++;
  68.             s2 += s1;
  69.         } while (--k);
  70.         MOD(s1);
  71.         MOD(s2);
  72.     }
  73.     return (s2 << 16) | s1;
  74. }
  75.